//
//  NumberFormatterT.swift
//  Documentation
//
//  Created by Toj on 7/24/23.
//

import Foundation

extension NumberFormatter {
    
    public enum Behavior : UInt, @unchecked Sendable {
        case `default` = 0
        case behavior10_4 = 1040
    }
    
    // 所有可变状态由锁保护, 所有子类必须是线程安全的
    // 默认为NSFormattingContextUnknown
    //  - (id)init; // 指定初始化器
    // 报告字符串的使用范围和NSError, 除了NSFormatter常用的东西
    // 尽管NSNumberFormatter响应通常的NSFormatter方法,
    // 这里有一些更明显的方便方法.
    /// 数字类型
    public enum Style : UInt, @unchecked Sendable {
        
        case none = 0 // 无格式类型, 四舍五入的整数
        
        case decimal = 1 // 小数类型, 保留小数输出2.8
        
        case currency = 2 // 货币形式(本地化), 加上了人民币标志, 原值输出￥2.8
        
        case percent = 3 // 百分比类型, 本身数值乘以100后用百分号表示, 输出280%
        
        case scientific = 4 // 科学计数类型, 原值表示, 输出2.799999999E0
        
        case spellOut = 5 // 朗读形式(本地化), 原值的中文表示, 输出二点七九九九...
        
        @available(iOS 9.0, *)
        case ordinal = 6 // 序数(本地化), 3nd
        
        @available(iOS 9.0, *)
        case currencyISOCode = 8 // 货币(本地化)ISO代码, CNY 2.799
        
        @available(iOS 9.0, *)
        case currencyPlural = 9 // 货币复数(本地化), 2.799 Chinese yuan
        
        @available(iOS 9.0, *)
        case currencyAccounting = 10 // 货币会记(本地化), 2.799
    }
    
    public enum PadPosition : UInt, @unchecked Sendable {
        /// 前缀前的case = 0
        case beforePrefix = 0
        /// 前缀后的大小写= 1
        case afterPrefix = 1
        /// 后缀前的大小写= 2
        case beforeSuffix = 2
        /// 后缀后的大小
        case afterSuffix = 3
    }
    
    /// 舍入模式
    public enum RoundingMode : UInt, @unchecked Sendable {
        
        /** 接近正无穷:
         * 当为正数时: 向远离0的地方进位
         * 当为负数时: 向靠近0的地方进位
         */
        case ceiling = 0
        
        /** 向负无穷大舍入:
         * 当为负数时: 向远离0的地方进位
         * 当为正数时: 向靠近0的地方进位
         */
        case floor = 1
        
        /** 向零舍入
         * 向靠近0的地方舍入
         */
        case down = 2
        
        /** 从零舍弃
         * 向远离0的地方进位
         */
        case up = 3
        
        /** 向最接近的整数, 如果多个整数等距离靠近那个数, 就选择一个偶数
         * 1. [-0.5, 0.5]时: 向0舍入
         * 2. (~, -0.5)/ (0.5, ~)时: 四舍五入
         */
        case halfEven = 4
        
        /** 向最接近的整数舍入, 或如果等距离, 则向零
         * 向最近的整数进位，当刚好在中间时，向小的方向退位
         * 四舍五入, 舍弃0.5
         */
        case halfDown = 5
        
        /** 向最接近的整数舍入, 或如果等距离, 则离开零
         * 在(0.5,-0.5)(开区间)时，向0舍入
         * 四舍五入, 保留0.5
         */
        case halfUp = 6
    }
}
